/**
 * Express 应用主文件
 * @author HalRui
 * @version 1.0.0
 * @description 基于Express框架的Web应用主入口文件，负责配置中间件、路由和错误处理
 * @date 2025年9月27日
 * 
 * 功能概述：
 * - 配置Express应用实例
 * - 设置视图引擎和中间件
 * - 配置模块化路由系统
 * - 处理404错误和全局错误
 * 
 * 路由架构：
 * - 基础路由：首页和用户管理
 * - 功能模块：内容、社交、通信、管理、系统
 */

// ================================
// 依赖模块导入
// ================================
const createError = require('http-errors');    // HTTP错误创建工具
const express = require('express');            // Express框架
const path = require('path');                  // 路径处理工具
const cookieParser = require('cookie-parser'); // Cookie解析中间件
const logger = require('morgan');              // HTTP请求日志中间件
const formidable = require("express-formidable"); // 表单数据解析中间件
const cors = require('cors');                  // CORS跨域资源共享中间件

// ================================
// 路由模块导入
// ================================

// 基础路由模块
const indexRouter = require('./routes/index');        // 首页路由 - 处理根路径访问
const usersRouter = require('./routes/users');  // 用户路由 - 处理用户相关操作

// 功能模块路由
const contentRouter = require('./routes/content');           // 内容模块 - 视频、评论、标签管理
const socialRouter = require('./routes/social');             // 社交模块 - 点赞、关注、收藏功能
const communicationRouter = require('./routes/communication'); // 通信模块 - 私信、通知功能
const adminRouter = require('./routes/admin');               // 管理模块 - 举报处理等管理功能
const systemRouter = require('./routes/system');             // 系统模块 - 健康检查、文档等

// ================================
// Express应用实例创建
// ================================
const app = express();

// ================================
// 视图引擎配置
// ================================
app.set('views', path.join(__dirname, 'views'));  // 设置视图文件目录
app.set('view engine', 'ejs');                    // 设置模板引擎为EJS

// ================================
// 中间件配置
// ================================

// CORS跨域配置
const corsOptions = {
    origin: [
        'http://localhost:3000',    // 开发环境前端地址
        'http://localhost:8080',    // 客户端静态服务器地址
        'http://127.0.0.1:3000',    // 本地开发地址
        'http://127.0.0.1:8080'     // 本地静态服务器地址
    ],
    credentials: true,              // 允许携带凭证（cookies）
    optionsSuccessStatus: 200,      // 对于旧版浏览器的兼容性
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的HTTP方法
    allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'uuid'] // 允许的请求头
};

app.use(cors(corsOptions));                                // CORS跨域支持
app.use(logger('dev'));                                    // 开发环境日志记录
app.use(cookieParser());                                   // Cookie解析
app.use(express.static(path.join(__dirname, 'public')));  // 静态文件服务

// 请求体解析中间件配置
// 标准JSON和URL编码解析（用于API请求）
app.use(express.json({ limit: '10mb' }));                 // JSON请求体解析
app.use(express.urlencoded({ extended: false, limit: '10mb' })); // URL编码请求体解析

// formidable中间件配置（用于表单和文件上传）
const formidableConfig = {
    maxFileSize: 100 * 1024 * 1024,  // 100MB文件大小限制
    maxFields: 100,                  // 最大字段数量
    maxFieldsSize: 2 * 1024 * 1024,  // 2MB字段大小限制
    timeout: 15000,                  // 15秒超时（增加超时时间）
    keepExtensions: true             // 保持文件扩展名
};

const videoUploadConfig = {
    maxFileSize: 100 * 1024 * 1024, // 100MB视频文件限制
    maxFields: 50,
    maxFieldsSize: 1 * 1024 * 1024,
    timeout: 30000,                  // 30秒超时（视频上传需要更长时间）
    keepExtensions: true
};

// 为需要表单数据处理的路由添加formidable中间件
// 只对需要文件上传的特定路由使用formidable
app.use('/users/change/change-avatar', formidable(formidableConfig)); // 头像上传路由
app.use('/social', formidable(formidableConfig));          // 社交功能路由
app.use('/content/videos', formidable(videoUploadConfig)); // 视频相关路由（需要更大文件支持）
// 标签路由不需要文件上传，使用标准JSON解析
// app.use('/content/tags', formidable(formidableConfig));

// 评论路由不使用formidable，使用标准JSON解析
// app.use('/content', formidable(formidableConfig));      // 注释掉通用content路由的formidable

// ================================
// 路由配置
// ================================

// 基础路由配置
app.use('/', indexRouter);        // 根路径 - 首页访问
app.use('/users', usersRouter);   // /users/* - 用户相关操作

// 功能模块路由配置
app.use('/content', contentRouter);           // /content/* - 内容管理（视频、评论、标签）
app.use('/social', socialRouter);             // /social/* - 社交功能（点赞、关注、收藏）
app.use('/communication', communicationRouter); // /communication/* - 通信功能（私信、通知）
app.use('/admin', adminRouter);               // /admin/* - 管理功能（举报处理）
app.use('/system', systemRouter);             // /system/* - 系统功能（健康检查、文档）

// ================================
// 错误处理
// ================================

// 404错误处理 - 捕获未匹配的路由
app.use(function(req, res, next) {
  next(createError(404));
});

// 全局错误处理器
app.use(function(err, req, res, next) {
  // 设置错误信息到本地变量
  res.locals.message = err.message;
  // 只在开发环境显示详细错误信息
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // 渲染错误页面
  res.status(err.status || 500);
  res.render('error');
});

// ================================
// 导出应用实例
// ================================
module.exports = app;
